package com.wgy.day40SQL.多表查询;

/**
 * Created by pc on 2020/12/21 22:19
 * Description: LearningJava
 */
/*
多表查询的分类:
1.内连接查询

   1.隐式内连接:使用where条件消除无用的数据
     SELECT *FROM emp, dept WHERE emp.`dept_id`=dept.`id`;
     SELECT
            t1.`name`,
            t1.`gender`,
            t2.name
     FROM
            emp t1,
            dept t2
     WHERE
            t1.`dept_id`=t2.`id`;

    2.显式内连接:
          语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件;
               SELECT  * FROM emp inner(可以省略) JOIN  dept ON emp.`dept_id`=dept.`id`;

    3.内连接查询的注意事项
         1.确定从哪些表中查询数据
         2.判断条件是什么
         3.确定查询的字段

    4.查询的范围:表的交集部分

2.外连接查询
   1.左外连接:
         语法: select 字段列表 from 表名1 left [outer] join 表名2 on 条件;
    查询的范围:查询的是左表的所有数据以及其交集部分

         查询所有员工的信息,如果员工有部门,查询部门信息,没有部门,则不显示部门名称
         SELECT  t1.*,t2.name FROM emp t1 LEFT JOIN  dept t2 ON  t1.`dept_id`=t2.`id`;
   2.右外连接:
        语法: select 字段列表 from 表名1 right [outer] join 表名2 on 条件;
   查询的范围:查询的是右表的所有数据以及其交集部分

3.子查询:
    概念:查询中嵌套查询,称嵌套查询为子查询
        比如: 查询工资最高的员工信息
             SELECT *FROM emp WHERE salary=(SELECT MAX(salary) FROM emp );
    子查询的不同情况:
        1.子查询的结果是单行单列
          子查询可以作为条件,使用运算符去判断  运算符:> >= < <= != <>
          比如:查询员工工资小于平均工资的人
              SELECT *FROM emp WHERE salary<(SELECT avg(salary) FROM emp );

        2.子查询的结果是多行单列
          子查询可以作为条件,使用运算符in来判断
          比如:查询财务部,市场部所以员工的信息
          select * from emp where (select id from dept where name='财务部' or name='市场部');
          select * from emp where (select id from dept where name in('财务部',市场部');

        3.子查询的结果是多行多列
          子查询可以作为一张虚拟表参与查询.
          比如: 查询员工的入职日期 是2018年11月11号之后的员工信息和部门信息
          SELECT * FROM dept t1, (SELECT * FROM emp WHERE emp.`join_date`>'2011-11-11') t2 WHERE t1.`id`=t2.dept_id;

          普通内连接:
          SELECT * FROM emp t1, dept t2 where t1.dept_id=t2.id and t1.`join_date`>'2011-11-11';





*/
public class Demo09 {
}
